package com.jzsk.variable.center.common.utils.buildjar;

import java.io.File;
import java.net.URL;
import java.util.ArrayList;
import java.util.List;

public class ClassUtil {

    /**
     * 获取指定包下的所有类的全限定名
     *
     * @param packageName 包名
     * @return 全限定名列表
     */
    public static List<ClassInfo> getAllClasses(String packageName) {
        List<ClassInfo> classInfoList = new ArrayList<>();
        try {
            // 获取指定包路径下的所有资源文件
            URL resource = Thread.currentThread().getContextClassLoader()
                    .getResource(packageName.replace(".", "/"));
            File directory = new File(resource.getPath());
            File[] files = directory.listFiles();
            for (File f : files) {
                if (f.isDirectory()) {
                    // 递归调用获取子目录下的所有类文件
                    classInfoList.addAll(getAllClasses(packageName + "." + f.getName()));
                } else if (f.getName().endsWith(".class")) {
                    // 加载类并获取全限定名
                    String className = packageName + "." + f.getName().substring(0, f.getName().length() - 6);
                    ClassInfo classInfo = ClassInfo.builder().className(className).clazz(f).build();
                    classInfoList.add(classInfo);
                }
            }
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
        return classInfoList;
    }

}
